#include "UDP.h"

int main(int argc, char const *argv[])
{ // 判断是否有按格式输入
    ARGV_IF(argc, 3);

    // 初始化变量
    int soc = 0; // 套接字
    // 客户端网络信息端口结构体
    struct sockaddr_in Client_Ip_Port;
    // 服务器端初始化
    UDP_Init_Sever(htons(atoi(argv[1])), argv[2], &soc);

    socklen_t Sock_Client = sizeof(Client_Ip_Port); // 客户端结构体长度
    //     printf("端口号%d\n",Client_Ip_Port.sin_port);
    // printf("ip地址%d\n",Client_Ip_Port.sin_addr.s_addr);
    // 文件传输结构体初始化
    file_data_str File_Fd_Data;
    // 接收发送文件请求
    printf("准备接收文件链接请求\n");
    recvfrom(soc, &File_Fd_Data, sizeof(File_Fd_Data), 0, (struct sockaddr *)&Client_Ip_Port, &Sock_Client);
    printf("连接成功\n");
    // 发送文件目录
    DIR *dir;
    dir = opendir("./DATA");
    memset(File_Fd_Data.buff, 0, sizeof(File_Fd_Data.buff));
    struct dirent *mulu;
    for (int i = 0; i < 9; i++)
    {
        mulu = readdir(dir); // 读取目录
        if (mulu == NULL)
        {
            printf("读取失败\n");
        }

        printf("|%s|\n", mulu->d_name);
        strcat(File_Fd_Data.buff, mulu->d_name);                 // 将文件名存入结构体中
        File_Fd_Data.buff[strlen(File_Fd_Data.buff)] = '\n';     // 通过换行来区分文件名
        File_Fd_Data.buff[strlen(File_Fd_Data.buff) + 1] = '\0'; // 感觉不需要后面再来调
        File_Fd_Data.num++;                                      // 文件数量加一
    }
    // 关闭文件
    closedir(dir);
    // 发送文件目录给客户端
    // printf("%s",File_Fd_Data.buff);
    sendto(soc, &File_Fd_Data, sizeof(File_Fd_Data), 0, (struct sockaddr *)&Client_Ip_Port, Sock_Client);
    printf("已发送文件给客户端\n");
    // 接收客户端发送指定文件
    recvfrom(soc, &File_Fd_Data, sizeof(File_Fd_Data), 0, (struct sockaddr *)&Client_Ip_Port, &Sock_Client);

    // 读取文件并传输文件内容
    // 用来存储文件路径
    char buf_1[1024];
    sprintf(buf_1, "%s/%s", "./DATA", File_Fd_Data.buff); // 拼接文件路径
    int fd = open(buf_1, O_RDONLY);
    File_Fd_Data.num = 1024; // 每次发送数量
    int m = 1;
    int k = 20;
    while (k)
    {
        k--;
        int len = read(fd, File_Fd_Data.buff, File_Fd_Data.num); // 读取文件内容
        File_Fd_Data.SYN = 2;
        File_Fd_Data.num = len;
        if (len >= 0)
        {
            // 发送文件内容
            // printf("%d发送前NUM = %d", m, File_Fd_Data.num);
            sendto(soc, &File_Fd_Data, sizeof(File_Fd_Data), 0, (struct sockaddr *)&Client_Ip_Port, Sock_Client);
        }
        // 接收传回的文件大小如果文件传输出错则重新发送
        memset(&File_Fd_Data, 0, sizeof(File_Fd_Data));
        recvfrom(soc, &File_Fd_Data, sizeof(File_Fd_Data), 0, (struct sockaddr *)&Client_Ip_Port, &Sock_Client);
        // printf("回传后NUM = %d\n", File_Fd_Data.num);
        m++;
        if (File_Fd_Data.num != len)
        {
            // printf("1111\n");
            // printf("回传后NUM = %d\n", File_Fd_Data.num);
            // printf("回传后len = %d\n", len);
            lseek(fd, SEEK_SET, 0);
            File_Fd_Data.SYN = 9; // SYN = 9 发送让客户端写入文件清空指令
        }

        if (File_Fd_Data.num == 0)
        {
            printf("传输完成\n");
            break;
        }
    }

    close(fd);

    // if (File_Fd_Data.num=))
    // {
    //     /* code */
    // }

    // 关闭套接字
    close(soc);
    return 0;
}
